home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / standards / sgml / nist / parse1 / brkout.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-09-13  |  6.7 KB  |  204 lines

  1. /************************************************************************/
  2. /*   TITLE:          SGML PARSER                                        */
  3. /*   SYSTEM:         DTD PROCESSOR                                      */
  4. /*   SUBSYSTEM:                                                         */
  5. /*   SOURCE FILE:    BRKOUT.C                                           */
  6. /*   AUTHOR:         Jim Heath                                          */
  7. /*                                                                      */
  8. /*   DATE CREATED:                                                      */
  9. /*   LAST MODIFIED:                                                     */
  10. /*                                                                      */
  11. /*                  REVISIONS                                           */
  12. /*   WHEN      WHO            WHY                                       */
  13. /************************************************************************/
  14. #include   <stdio.h>
  15. #include   <setjmp.h>
  16. #include   <fcntl.h>
  17. #include   <sys/types.h>
  18. #include   <sys/stat.h>
  19. #include   "qntyset.h"
  20. #include   "dtd.h"
  21.  
  22. #define    NO       0
  23. #define    YES      1
  24.  
  25.  
  26. void       error();
  27. void       heading();
  28. void       bldsymbltbl();
  29. void       showcontents();
  30. char       *getmsg();
  31. /* ==================================================================== */
  32. #define    MAXSYM   100
  33. /* ==================================================================== */
  34. SYMBREC symbol[MAXSYM];
  35. jmp_buf Xenv;
  36. /* ==================================================================== */
  37. main(argc, argv)
  38. int argc;
  39. char *argv[];
  40. {
  41.    int infile,numtokens,firsttoken;
  42.    unsigned char temp[128], fname[128];
  43.    int j;
  44.  
  45.    heading();
  46.    if (argc == 1)
  47.       strcpy(fname,"dtdfile.sgm");
  48.    else
  49.       strcpy(fname, argv[1]);
  50.    if ((infile = open(fname, O_RDONLY)) == -1){
  51.       sprintf(temp,"unable to open %s", fname);
  52.       error(temp);
  53.    }
  54.    read(infile, &numtokens, sizeof(numtokens));
  55.    printf("total tokens = %d\n", numtokens);
  56.    read(infile, &firsttoken, sizeof(firsttoken));
  57.    printf("first token  = %d\n", firsttoken);
  58.    bldsymbltbl(infile, numtokens);
  59.    if (setjmp(Xenv) != 0)
  60.       goto DONE;
  61.    for ( j = 0; j < numtokens; j++) {
  62.      printf("------------------------------------------------------\n");
  63.      printf("Content Model for: <token = %03d> ", j);
  64.      printf("%s \n", symbol[j].Sname);
  65.      showcontents(infile);
  66.    }
  67. DONE:
  68.    close(infile);
  69. }
  70. /* ==================================================================== */
  71. void error(msg)
  72. unsigned char *msg;
  73. {
  74.    printf(msg);
  75.    exit(1);
  76. }
  77. /* ==================================================================== */
  78. void bldsymbltbl(infile, numtokens)
  79. int infile, numtokens;
  80. {
  81.    int j;
  82.    unsigned char tempname[128]; 
  83.    for (j = 0; j < numtokens; j++){
  84.       if(read(infile, &symbol[j], sizeof(symbol[j])) != sizeof(symbol[j])){
  85.       perror("error in read() in bldsymbltbl()");
  86.       exit(1);
  87.      }
  88.       memset(tempname, '\0', sizeof(tempname));
  89.       strncpy(tempname, symbol[j].Sname, 8);
  90.       tempname[8] = '\0';
  91.       if (symbol[j].Smin == 0)
  92.          printf("- - ");
  93.       else if (symbol[j].Smin == 1)
  94.          printf("O - ");
  95.       else if (symbol[j].Smin == 2)
  96.          printf("- O ");
  97.       else if (symbol[j].Smin == 3)
  98.          printf("O O ");
  99.       symbol[j].Sname[NAMELEN - 1] = '\0';
  100.       printf("NAME = %s; tokennbr = %03d\n", tempname, symbol[j].Sid);
  101.    }
  102. }
  103. /* ==================================================================== */
  104. void showcontents(infile)
  105. int infile;
  106. {
  107.    DTDREC dtdrec;
  108.    int count, j;
  109.   
  110.    if (read(infile, &dtdrec, sizeof(dtdrec)) <= 0) 
  111.       longjmp(Xenv, 1);
  112.    else {
  113.       switch(dtdrec.Dtoken) {
  114.          case (COMMA): 
  115.          printf("connector = ',' oi = %c\n", dtdrec.Doi); 
  116.          showcontents(infile);
  117.          showcontents(infile);
  118.          return;
  119.          case (AMPERSAND): 
  120.          printf("connector = '&' oi = %c", dtdrec.Doi); 
  121.          read(infile, &count, sizeof(count));
  122.          printf(" <items in & group = %d>\n", count);
  123.          for (j = 0; j < count; j++)
  124.          showcontents(infile);
  125.          return;
  126.          case (OR): 
  127.          printf("connector = '|' oi = %c\n", dtdrec.Doi); 
  128.          showcontents(infile);
  129.          showcontents(infile);
  130.          return;
  131.          case (-1):  
  132.          printf("#PCDATA %c\n", dtdrec.Doi); 
  133.          return;
  134.          case (-3):  
  135.          printf("RCDATA %c\n", dtdrec.Doi); 
  136.          return;
  137.          case (-4):  
  138.          printf("CDATA %c\n", dtdrec.Doi); 
  139.          return;
  140.          case (-5):  
  141.          printf("EMPTY %c\n", dtdrec.Doi); 
  142.          return;
  143.          case (-6):  
  144.          printf("ANY %c\n", dtdrec.Doi); 
  145.          return;
  146.       default:    
  147.          printf("<token = %03d> %s  <oi = %c>  ",
  148.                 dtdrec.Dtoken, symbol[dtdrec.Dtoken].Sname,dtdrec.Doi);
  149.          printf("\\%s\\\n", getmsg(dtdrec.Dcontreq));
  150.  
  151.          return;
  152.       }
  153.    }
  154. }
  155. /* ==================================================================== */
  156. /* ==================================================================== */
  157. /* ==================================================================== */
  158. int safeopen(fname, mode)
  159. unsigned char *fname;
  160. int mode;
  161. {
  162. extern int debug;
  163. int temp;
  164.    if ((temp = open(fname, mode)) !=  -1) 
  165.       return(temp);
  166.    fprintf(stderr, "error in opening %s\n", fname);
  167.    exit(1);
  168. }
  169. /* ==================================================================== */
  170.  
  171. /*----------------------------------------------*/
  172. /*         HEADING         */
  173. /* Simply prints a informatory heading */
  174. /* when the document parser is invoked */
  175. /* describing the document name to be  */
  176. /* parsed.              */
  177. /*----------------------------------------------*/
  178.  
  179. void heading()
  180. {
  181.    printf("\n                          DTDFILE Decoder\n");
  182.    printf("                      Decodes DTDFILES built by PARSE2\n");
  183.    printf("          --------------------------------------------------\n");
  184.    printf("                      03Nov86      Version 1.01\n");
  185.    printf("          --------------------------------------------------\n\n");
  186.    return;
  187. }
  188. /* ==================================================================== */
  189. /* ==================================================================== */
  190. char *getmsg(x)
  191. enum CONTEXT x;
  192. {
  193.     switch (x) {
  194.        case C_NEVERO:      return("<start tag is never omissable>");
  195.        case C_ALWAYSO:     return("<start tag is always omissable>");
  196.        case C_SOMETIMESO:  return("<start tag is sometimes omissable>");
  197.        case C_FTO:         return("<start tag is omissable first time only>");
  198.        case C_FTOWR:       return("<start tag is omissable FTO with reset>");
  199.        case C_FTOTSO:      return("<start tag is omissable FTO then sometimes>");
  200.        default:
  201.                            return("UNKNOWN ARGUMENT TO GETMSG()");
  202.     }
  203. }
  204.